/*
 * IStrutureBTreeImpl.h
 *
 *      Author: carlos
 */

#ifndef ISTRUTUREBTREEIMPL_H_
#define ISTRUTUREBTREEIMPL_H_
#include "IStructureNew.h"
#include "../bplustree/BPlusTree.h"
#include "../../exceptions/ProgramException.h"
#include "../../utils/StringUtils.h"
#include "GenericIndexable.h"
class BPlussIStructureFactory;
class IStrutureBTreeImpl: public IStructureNew {
	friend class BPlussIStructureFactory;
protected:
	IStrutureBTreeImpl(ESTRUCTURAS estructura);
public:
	virtual ~IStrutureBTreeImpl();
	virtual int insert(IEntidad* entidad);
	virtual int modify(IEntidad* entidad);

	//virtual int insert(GenericIndexable* indexable);
	//virtual int modify(GenericIndexable* indexable);

	virtual int remove(string genericKey);
	virtual GenericIndexable* findGenericIndexable(string key);


//          Esto hay que sacarlo ahora se usa la entidad generica. Dejo los metodos para un refactor mas adelante//

	virtual IEntidad* find(string key);
	//virtual int remove(string key);
	virtual IEntidad* findAproximado(string key);
	void toString();
	virtual IEntidad* siguiente();
	virtual IEntidad* anterior();

	/**
	 * Elimina la estructura. Su archivo fisico
	 */
	virtual void dropStructure();

	 virtual void exportar(){
		 this->bplusTree->exportTree();
	 }
protected:
	virtual void allowException(string mensaje);

private:
	//ojo no hacer delete. No lo pongo como referencia porque necesito saber si esta inicializado
	LeafNode* hojaActual;
	BPlusTree* bplusTree;
	std::vector<IElement*>::iterator it;
};

#endif /* ISTRUTUREBTREEIMPL_H_ */
